package cn.jwheel.quartz.job;


import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

/**
 * Quartz的基本组成部分：
 * 调度器：Scheduler
 * @see org.quartz.Scheduler
 * @see org.quartz.SchedulerFactory
 * @see org.quartz.SchedulerContext
 * 任务：job(JobDetail)
 * @see org.quartz.Job
 * @see org.quartz.JobDetail
 * 触发器：Trigger，包括SimpleTrigger和CronTrigger
 * @see org.quartz.Trigger
 * @see org.quartz.TriggerBuilder
 * @see org.quartz.SimpleTrigger
 * @see org.quartz.CronTrigger
 *
 * 为什么设计成 jobDetail + Job，不直接使用Job？
 * JobDetail定义的是任务数据，而真正的执行逻辑是在Job中。
 * 这是因为任务是有可能并发执行，如果Scheduler直接使用Job，就会存在对同一个Job实例并发访问的问题。而JobDetail & Job 方式，Sheduler每次执行，都会根据JobDetail创建一个新的Job实例，这样就可以规避并发访问的问题。
 *
 * @description
 * @date 2021/1/4
 */
public abstract class TestJob implements Job {

    @Override
    public void execute(JobExecutionContext ctx) throws JobExecutionException {

        JobDetail jobDetail = ctx.getJobDetail();
        Job jobInstance = ctx.getJobInstance();
        long jobRunTime = ctx.getJobRunTime();
        System.out.println("jobDetail: "+jobDetail);
        System.out.println("jobInstance: "+jobInstance);
        System.out.println("jobRunTime: "+jobRunTime);

        String str = executeJob();

    }
    public abstract String executeJob();
}
